package com.init.bootframe.system.service.impl;

import com.init.bootframe.system.dao.IBaseDataDao;
import com.init.bootframe.system.service.IBaseDataService;
import com.init.bootframe.system.vo.BaseDataVO;
import com.init.bootframe.util.TmompConstant;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 基础数据service
 */
@Service
public class BaseDataServiceImpl implements IBaseDataService {

    private Logger logger = LoggerFactory.getLogger(BaseDataServiceImpl.class); //日志

    @Autowired
    private IBaseDataDao baseDataDao; //基础数据dao

    /**
     * 根据条件查询基础数据信息
     * @param baseDataVO
     * @return
     */
    public List<BaseDataVO> findBaseDataListByCode(BaseDataVO baseDataVO) {
        return baseDataDao.findBaseDataListByCode(baseDataVO);
    }

    /**
     * 分页查询基础数据信息
     * @param baseDataVO
     * @return
     */
    @Override
    public JSONObject findBaseDataList(BaseDataVO baseDataVO) {
        JSONObject jsonObject = new JSONObject();
        // 查询集合数据总数
        int total = baseDataDao.findBaseDataListCount(baseDataVO);
        // 查询集合数据
        List<BaseDataVO> baseDataList = new ArrayList<BaseDataVO>();
        if (total > 0) {
            baseDataList = baseDataDao.findBaseDataList(baseDataVO);
        }
        jsonObject.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_ROWS, baseDataList);
        jsonObject.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_TOTAL, total);
        return jsonObject;
    }

    /**
     * 添加基础数据
     * @param baseDataVO
     * @return
     */
    @Override
    public Map<String, Object> addBaseData(BaseDataVO baseDataVO) {
        // 消息对象
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            if (null == baseDataVO.getBaseParentId() || "".equals(baseDataVO.getBaseParentId())) {
                baseDataVO.setBaseParentId("0");
                baseDataVO.setBaseCodeValue("-");
            } else {
                // 设置子项编码
                BaseDataVO bdVO = new BaseDataVO();
                bdVO.setBaseId(baseDataVO.getBaseParentId());
                BaseDataVO baseData = baseDataDao.findBaseDataById(bdVO);
                baseDataVO.setBaseCode(baseData.getBaseCode());
            }
            // 添加基础数据
            baseDataDao.createBaseData(baseDataVO);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加基础数据成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加基础数据失败！");
            logger.info("添加基础数据失败！" + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 修改基础数据
     * @param baseDataVO
     * @return
     */
    @Override
    public Map<String, Object> updateBaseData(BaseDataVO baseDataVO) {
        // 消息对象
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            BaseDataVO BaseDataVO = new BaseDataVO();
            BaseDataVO.setBaseId(baseDataVO.getBaseId());
            BaseDataVO = baseDataDao.findBaseDataById(BaseDataVO);
            if (null != BaseDataVO) {
                // 当父配置的编码修改了，所有子项的编码也要修改。
                baseDataDao.updateBaseCode(BaseDataVO.getBaseCode(), baseDataVO.getBaseCode());
                // 修改状态
                BaseDataVO vo = new BaseDataVO();
                vo.setStatus(baseDataVO.getStatus());
                // 当为最高节点时，修改下面所有状态
                if (baseDataVO.getBaseCodeValue().equals("-")) {
                    vo.setBaseCode(BaseDataVO.getBaseCode());
                    vo.setBaseCodeValue("");
                    // 修改子节点ID
                } else if ("".equals(baseDataVO.getBaseCodeValue()) && null != baseDataVO.getBaseCodeValue()) {
                    // vo.setBaseCodeValue(baseDataVO.getBaseCodeValue());
                    // 修改父节点及以下
                    if (baseDataVO.getStatus().equals(TmompConstant.BaseDataConstant.DEFAULT_VALUE_ZERO)) {
                        String ids = baseDataDao.findBaseDataLower(baseDataVO.getBaseId());
                        String baseIds[] = ids.split(",");
                        vo.setBaseIds(baseIds);
                        vo.setBaseId(baseDataVO.getBaseId());
                        baseDataDao.updateStatusAll(vo);
                        // 修改父节点及以上
                    } else if (baseDataVO.getStatus().equals(TmompConstant.BaseDataConstant.DEFAULT_VALUE_ONE)) {
                        String ids = baseDataDao.findBaseDataSuperior(baseDataVO.getBaseId());
                        String baseIds[] = ids.split(",");
                        vo.setBaseIds(baseIds);
                        vo.setBaseId(baseDataVO.getBaseId());
                        baseDataDao.updateStatusAll(vo);
                    }
                }
                baseDataDao.updateStatus(vo);
                baseDataDao.updateBaseData(baseDataVO);
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改基础数据成功！");
            }
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改基础数据失败！");
            logger.info("修改基础数据失败！" + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 删除基础数据
     * @param baseDataVO
     * @return
     */
    @Override
    public Map<String, Object> deleteBaseData(BaseDataVO baseDataVO) {
        // 消息对象
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 查询是否存在子节点
            // 判断是否存在子节点，如果存在则不允许删除
            List<BaseDataVO> baseDataList = baseDataDao.findExistsParentBaseData(baseDataVO);
            if (null != baseDataList && baseDataList.size() > 0) {
                String baseNames = "";
                for (int i = 0; i < baseDataList.size(); i++) {
                    baseNames += baseDataList.get(i).getBaseName();
                    if (i != baseDataList.size() - 1) {
                        baseNames += ",";
                    }
                }
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG,
                        "编码名称[" + baseNames + "]存在子节点数据，不允许删除！");
            } else {
                // 删除基础数据
                baseDataDao.deleteBaseData(baseDataVO);
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
                resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除基础数据成功！");
            }
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除基础数据失败！");
            logger.error("删除基础数据失败！" + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 根据baseId查询基础数据信息
     * @param baseDataVO
     * @return
     */
    @Override
    public BaseDataVO findBaseDataInfo(BaseDataVO baseDataVO) {
        return baseDataDao.findBaseDataById(baseDataVO);
    }

    /**
     * 查询所有有效系统基础数据信息
     * 缓存在redis中
     * @param baseDataVO
     *            参数系统基础数据对象
     * @return
     */
    @Override
    public Map<String, Object> refreshSysBaseData(BaseDataVO baseDataVO) {
        return null;
    }

    /**
     * 查询所有有效系统基础数据信息
     *
     * 缓存在reidis中
     *
     * 系统加载基础数据之一
     *
     * @throws Exception
     */
    @Override
    public void loadSysBaseData() throws Exception {

    }

    /**
     * 查询所有国际化信息
     *
     * 分组缓存（redis）国际化信息
     *
     * 系统加载基础数据之一（不对外开发接口，过滤token认证）
     *
     * @throws Exception
     *
     */
    @Override
    public void loadLangPropties() throws Exception {

    }


}
